package DAO;


import models.Asignatura;
import logicBusiness.AreaBL;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;

public class AsignaturaDao {

    protected EntityManager em;
    private Asignatura as = new Asignatura();

    public AsignaturaDao() {
        EntityManagerFactory emf =
                Persistence.createEntityManagerFactory("sischoolPU");
        em = emf.createEntityManager();
    }
    public AsignaturaDao(EntityManager em) {
        this.em = em;
    }

    public Asignatura crearAsignatura(Integer idProfesor, String nombreAsignatura, Integer intensidadHoraria, Integer idGrado, Integer idArea, Integer idLaboratorio) {
//        as.setIdGrado(idGrado);
//        as.setIdArea(idArea);
//        as.setIdProfesor(idProfesor);
//        as.setNombreAsignatura(nombreAsignatura);
//        as.setIntensidadHoraria(intensidadHoraria);
//        as.setIdLaboratorio(idLaboratorio);
        em.persist(as);
        return as;
    }

    public Asignatura intanciarAsignatura(Object objeto) {
        as = (Asignatura) objeto;
        return as;
    }

    public Asignatura encontrarAsignatura(Integer idAsignatura) {
        return em.find(Asignatura.class, idAsignatura);// con esta funcion se buscas un dato por primary key, el primer parametro es nuestra clase entidad
    }

    public Asignatura encontrarAsignatura(String nombreAsignatura, Integer idGrado) {

        Query q = em.createQuery("select at from Asignatura at where at.nombreAsignatura='" + nombreAsignatura + "'" + " AND at.idGrado = " + idGrado);
        if (q.getResultList().isEmpty() == true) {
            return null;
        } else {
            as = (Asignatura) q.getSingleResult();
            return as;
        }
        //return as;
    }

    public void borrarAsignatura(Integer idAsignatura) {
        as = encontrarAsignatura(idAsignatura);//en este caso podemos borrar una Asignatura por id
        if (as != null) {//si no lo encuentra por supuesto no lo intenta borrar
            em.remove(as);// borra de la tabla ese registro
            }

    }

    public Asignatura actualizarAsignatura(String nombreAsignaturaAntiguo, Integer idGradoAntiguo, String nombreAsignaturaNuevo, Integer intensidadHorariaNuevo, Integer idGradoNuevo, String nombreAreaNuevo) {
        Asignatura as1; //Aqui se guardaria el posible dato duplicado de la BD, si no encuentra otro registro con nombre nuevo sera null
        AreaBL ar1 = new AreaBL();
        int ar;

        ar = ar1.encontrarArea(nombreAreaNuevo);
        as = encontrarAsignatura(nombreAsignaturaAntiguo, idGradoAntiguo); //Uso un metodo de esta misma clase que me retorna un solo dato con una busqueda por nombre
        if (as != null) {
            /*
            Ahora se verifica que los datos ingresados no existan ya en la BD
             */

            as1 = encontrarAsignatura(nombreAsignaturaNuevo, idGradoNuevo);
//
//            if (as1 == null || (as1.getNombreAsignatura().equals(nombreAsignaturaAntiguo) && as1.getIdGrado().equals(idGradoAntiguo))) {
//                as.setIdArea(ar);
//                as.setIdGrado(idGradoNuevo);
//                as.setIntensidadHoraria(intensidadHorariaNuevo);
//                as.setNombreAsignatura(nombreAsignaturaNuevo);
//            }
        }
        return as;
    }

    public List encontrarAsignaturas() {
        Query query = em.createQuery("SELECT a FROM Asignatura a");
        List<Asignatura> lista = query.getResultList();
        return (lista);
    }

    public List encontrarAsignaturasId() { //encontrar todos los usuarios
        Query query = em.createQuery("SELECT as.idAsignatura FROM Asignatura as");// Ojo la sentencia está en Java Query Language, no SQL
        List<Asignatura> lista = query.getResultList();
        return (lista);
    }

    public List encontrarAsignaturasArea(String nombreArea) { //encontrar las asignaturas por el nombre del area a la que pertenecen
        Query query = em.createQuery("SELECT at FROM Asignatura at, Area ar WHERE at.idArea = ar.idArea AND ar.nombreArea = '" + nombreArea + "'");// Ojo la sentencia está en Java Query Language, no SQL
        List<Asignatura> lista = query.getResultList();
        return (lista);
    }

    public List encontrarAsignaturasAreaGrado(String nombreArea, Integer idGrado) {

        Query query = em.createQuery("SELECT at FROM Asignatura at, Area ar WHERE at.idArea = ar.idArea AND at.idGrado =" + idGrado + " AND ar.nombreArea = '" + nombreArea + "'");
        List<Asignatura> lista = query.getResultList();
        return (lista);

    }

  
    public List encontrarAsignaturasGrado(int idGrado) {
        Query query = em.createQuery("SELECT a FROM Asignatura a WHERE a.idGrado=" + idGrado + "");
        List<Asignatura> lista = query.getResultList();
        return (lista);
    }

    public Asignatura encontrarAsignatura(String nombreAsignatura) {
        Query q = em.createQuery("SELECT a FROM Asignatura a WHERE a.nombreAsignatura='" + nombreAsignatura + "'");
        if (q.getResultList().isEmpty() == true) {
            return null;
        } else {
            as = (Asignatura) q.getSingleResult();
            return as;
        }
    }
}
